﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Net;
using System.Web;
using System.Web.Mvc;
using blacksoft.Models;
using blacksoft.Constantes;

namespace blacksoft.Controllers
{
    public class PerdidaController : Controller
    {
        private inf245travelbusEntities db = new inf245travelbusEntities();

        private class ItemListaProductos {
            public int IdAlmacen { get; set; }
            public string nombre { get; set; }

            public ItemListaProductos(int id_almacen, string nombre)
            {
                this.IdAlmacen = id_almacen;
                this.nombre = nombre;
            }
        }


        private List<ItemListaProductos> obtenerListProductos()
        {
            int idTerminal = (int)Session["IDTerminal"];
            var producto_query = from p in db.Almacen
                                 select p;
            producto_query = producto_query.Where(r => r.IDTerminal == idTerminal);
            producto_query = producto_query.Where(s => s.StockActual > 0);
            producto_query = producto_query.OrderBy(t => t.Producto.Nombre);

            List<ItemListaProductos> productos_lst = new List<ItemListaProductos>();
            foreach (var prod in producto_query) {
                productos_lst.Add(new ItemListaProductos(prod.IdAlmacen, prod.Producto.Nombre));
            }
            productos_lst.Distinct().ToList();
            return productos_lst;
        }

        // GET: /Perdida/
        public ActionResult Index()
        {
            // **** SEGURIDAD DE ACCESO ****
            ActionResult result_seguridad = ValidarSeguridad();
            if (result_seguridad != null)
            {
                return result_seguridad;
            }
            //  ------             --------
            var movimiento = db.Movimiento.Include(m => m.Almacen).Include(m => m.ProgramacionViaje);
            // ****  GET ID Terminal    ****
            bool global = PerfilsController.TienePermiso((int)Session["Permisos"], PerfilsController.GLOBAL);
            int idTerminal = (int)Session["IDTerminal"];
            if (!global)
            {
                movimiento = movimiento.Where(o => o.Almacen.IDTerminal == idTerminal);
            }
            // ------              --------
            movimiento = movimiento.Where(n => n.Tipo == 3);
            return View(movimiento.ToList());
        }

        // GET: /Perdida/Details/5
        public ActionResult Details(int? id)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            Movimiento movimiento = db.Movimiento.Find(id);
            if (movimiento == null)
            {
                return HttpNotFound();
            }
            return View(movimiento);
        }

        // GET: /Perdida/Create
        public ActionResult Create()
        {
            // **** SEGURIDAD DE ACCESO ****
            ActionResult result_seguridad = ValidarSeguridad();
            if (result_seguridad != null)
            {
                return result_seguridad;
            }
            //  ------             --------
            List<ItemListaProductos> tmpListProducto = obtenerListProductos();
            ViewBag.IdAlmacen = new SelectList(tmpListProducto, "IdAlmacen", "nombre");
            var tmpListProgramcion = from pv in db.ProgramacionViaje
                                     where pv.Estado=="PR"
                                     select pv;
            ViewBag.IDProgramacionViaje = new SelectList(tmpListProgramcion, "IDProgramacionViaje", "Descripcion");

            return View();
        }

        // POST: /Perdida/Create
        // Para protegerse de ataques de publicación excesiva, habilite las propiedades específicas a las que desea enlazarse. Para obtener 
        // más información vea http://go.microsoft.com/fwlink/?LinkId=317598.
        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Create([Bind(Include="IDProgramacionViaje,Cantidad,IdAlmacen,IdMovimiento,Tipo, Fecha")] Movimiento movimiento)
        {
            movimiento.Tipo = 3;
            var product = from p in db.Almacen
                          where p.IdAlmacen == movimiento.IdAlmacen
                          select p;
            Almacen almacen = null;
            try
            {
                almacen = product.ToList().ElementAt(0);
            }
            catch { }
            if (ModelState.IsValid)
            {
                if (movimiento.Cantidad < 0)
                {
                    TempData["MODCOMP_merma_create_failure_pos"] = "Debe ingresar una cantidad positiva";
                }
                else if (almacen != null)
                {
                    if(almacen.StockActual< movimiento.Cantidad){
                        TempData["MODCOMP_merma_create_failure_neg"] = "La merma debe ser mayor al stock actual";
                    }
                    else if(movimiento.Fecha >= DateTime.Now)
                    {
                        TempData["MODCOMP_merma_create_failure_neg"] = "Debe indicar una fecha anterior a la actual";

                    }else{
                        almacen.StockActual -= movimiento.Cantidad;
                        db.Movimiento.Add(movimiento);
                        db.SaveChanges();
                        return RedirectToAction("Index");
                    }
                }
                
            }

            //necesito una lista de los nombres de los productos en el almacen y que esa lista se realcione con el idalmacen
            List<ItemListaProductos> tmpListProducto = obtenerListProductos();
            ViewBag.IdAlmacen = new SelectList(tmpListProducto, "IdAlmacen", "nombre");
            ViewBag.IDProgramacionViaje = new SelectList(db.ProgramacionViaje, "IDProgramacionViaje", "Descripcion", movimiento.IDProgramacionViaje);
            return View(movimiento);
        }

        // GET: /Perdida/Edit/5
        public ActionResult Edit(int? id)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            Movimiento movimiento = db.Movimiento.Find(id);
            if (movimiento == null)
            {
                return HttpNotFound();
            }
            ViewBag.IdAlmacen = new SelectList(db.Almacen, "IdAlmacen", "IdAlmacen", movimiento.IdAlmacen);
            ViewBag.IDProgramacionViaje = new SelectList(db.ProgramacionViaje, "IDProgramacionViaje", "Descripcion", movimiento.IDProgramacionViaje);
            return View(movimiento);
        }

        // POST: /Perdida/Edit/5
        // Para protegerse de ataques de publicación excesiva, habilite las propiedades específicas a las que desea enlazarse. Para obtener 
        // más información vea http://go.microsoft.com/fwlink/?LinkId=317598.
        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Edit([Bind(Include="IDProgramacionViaje,Cantidad,IdAlmacen,IdMovimiento,Tipo")] Movimiento movimiento)
        {
            if (ModelState.IsValid)
            {
                db.Entry(movimiento).State = EntityState.Modified;
                db.SaveChanges();
                return RedirectToAction("Index");
            }
            ViewBag.IdAlmacen = new SelectList(db.Almacen, "IdAlmacen", "IdAlmacen", movimiento.IdAlmacen);
            ViewBag.IDProgramacionViaje = new SelectList(db.ProgramacionViaje, "IDProgramacionViaje", "Descripcion", movimiento.IDProgramacionViaje);
            return View(movimiento);
        }

        // GET: /Perdida/Delete/5
        public ActionResult Delete(int? id)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            Movimiento movimiento = db.Movimiento.Find(id);
            if (movimiento == null)
            {
                return HttpNotFound();
            }
            return View(movimiento);
        }

        // POST: /Perdida/Delete/5
        [HttpPost, ActionName("Delete")]
        [ValidateAntiForgeryToken]
        public ActionResult DeleteConfirmed(int id)
        {
            Movimiento movimiento = db.Movimiento.Find(id);
            db.Movimiento.Remove(movimiento);
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
                db.Dispose();
            }
            base.Dispose(disposing);
        }

        private ActionResult ValidarSeguridad()
        {

            if (Session["Permisos"] == null)
            {
                TempData["LogueatePrimero"] = SystemField.NO_LOGUEADO;
                return RedirectToAction("Index", "ValidarLogin");
            }
            //ESTOY LOGUEADO PERO NO TENGO PERMISO PARA REALIZAR ESTA ACCION
            if (!PerfilsController.TienePermiso((int)Session["Permisos"], PerfilsController.COMPRAS))
            {
                TempData["SinPermiso"] = SystemField.SIN_PERMISO;
                return RedirectToAction("Index", "MainPageEmployes");
            }
            return null;
        }
    }
}
